package com.village.friend.pay.alipay;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayResponse;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.ExtendParams;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.village.friend.constant.MsgCodeEnum;
import com.village.friend.constant.PayStatus;
import com.village.friend.dto.response.BaseResponse;
import com.village.friend.entity.UserOrder;
import com.village.friend.pay.Constants;
import com.village.friend.pay.Product;
import com.village.friend.utils.OrderUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.Map;

@Service
public class AliPayServiceImpl {
    private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class);
    @Value("${ali.notify_url}")
    private String notify_url;/*= "https://m.sunteampay.com/m/app/pay/aliPayNotifyRes"*/

    /**
     * 阿里支付预下单
     * 如果你调用的是当面付预下单接口(alipay.trade.precreate)，调用成功后订单实际上是没有生成，因为创建一笔订单要买家、卖家、金额三要素。
     * 预下单并没有创建订单，所以根据商户订单号操作订单，比如查询或者关闭，会报错订单不存在。
     * 当用户扫码后订单才会创建，用户扫码之前二维码有效期2小时，扫码之后有效期根据timeout_express时间指定。
     * 2018年起，扫码支付申请需要门店拍照等等，申请流程复杂了
     * @Author
     * @param product
     * @return String
     * @Date 2017年7月27日
     * 更新日志
     * 2017年7月27日
     *
     */
    /**
     * APP支付
     *
     * @param product
     * @return String
     * @Author
     * @Date 2017年9月21日 更新日志
     * 2017年9月21日
     */
    public BaseResponse aliPay(Product product) {
        logger.info("订单号：{}生成支付宝支付码", product.getOutTradeNo());
        String message = PayStatus.SUCCESS.getValue();
        //二维码存放路径
        //		System.out.println(Constants.QRCODE_PATH);
        //		String imgPath= Constants.QRCODE_PATH+Constants.SF_FILE_SEPARATOR+product.getOutTradeNo()+".png";
        String outTradeNo = product.getOutTradeNo();
        String subject = product.getSubject();
        String totalAmount = OrderUtils.divide(product.getTotalFee(), "100").toString();
        // 如果该字段为空，则默认为与支付宝签约的商户的PID，也就是appid对应的PID
        String sellerId = "";
        // (必填) 商户门店编号，通过门店号和商家后台可以配置精准到门店的折扣信息，详询支付宝技术支持
        String storeId = "test_store_id";
        // 业务扩展参数，目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法)，详情请咨询支付宝技术支持
        ExtendParams extendParams = new ExtendParams();
        extendParams.setSysServiceProviderId("2088100200300400500");
        // 订单描述，可以对交易或商品进行一个详细地描述，比如填写"购买商品2件共15.00元"
        String body = product.getBody();
        // 支付超时，定义为30分钟
        String timeoutExpress = "30m";
        // 创建扫码支付请求builder，设置请求参数
        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setSellerId(sellerId).setBody(body)//128长度 --附加信息
                .setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress).setNotifyUrl(notify_url);//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置

        AlipayF2FPrecreateResult result = AliPayConfig.getAlipayTradeService().tradePrecreate(builder);

        switch (result.getTradeStatus()) {
            case SUCCESS:
                logger.info("支付宝预下单成功: )");

                AlipayTradePrecreateResponse response = result.getResponse();
                //			dumpResponse(response);
                //			ZxingUtils.getQRCodeImge(response.getQrCode(), 256, imgPath);
                Map<String, Object> dataMap = JSONObject.parseObject(response.getBody());
                return new BaseResponse(MsgCodeEnum.SUCCESS, dataMap);

            case FAILED:
                logger.info("支付宝预下单失败!!!");

            return new BaseResponse(MsgCodeEnum.OTHER_ERROR, "支付宝预下单失败");

            case UNKNOWN:
                logger.info("系统异常，预下单状态未知!!!");
            return new BaseResponse(MsgCodeEnum.OTHER_ERROR, "系统异常，预下单状态未知");
            default:
                logger.info("不支持的交易状态，交易返回异常!!!");
                return  new BaseResponse(MsgCodeEnum.OTHER_ERROR, "不支持的交易状态，交易返回异常!!!") ;
        }
    }

    // 简单打印应答
    private void dumpResponse(AlipayResponse response) {
        if (response != null) {
            logger.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));
            if (StringUtils.isNotEmpty(response.getSubCode())) {
                logger.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(), response.getSubMsg()));
            }
            logger.info("body:" + response.getBody());
        }
    }

    /**
     * 阿里支付退款
     *
     * @param product
     * @return String
     * @Author
     * @Date 2017年7月27日 更新日志
     * 2017年7月27日
     */
    public String aliRefund(Product product) {
        logger.info("订单号：" + product.getOutTradeNo() + "支付宝退款");
        String message = Constants.SUCCESS;
        // (必填) 外部订单号，需要退款交易的商户外部订单号
        String outTradeNo = product.getOutTradeNo();
        // (必填) 退款金额，该金额必须小于等于订单的支付金额，单位为元
        String refundAmount = OrderUtils.divide(product.getTotalFee(), "100").toString();

        // (必填) 退款原因，可以说明用户退款原因，方便为商家后台提供统计
        String refundReason = "正常退款，用户买多了";

        // (必填) 商户门店编号，退款情况下可以为商家后台提供退款权限判定和统计等作用，详询支付宝技术支持
        String storeId = "test_store_id";

        // 创建退款请求builder，设置请求参数
        AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder().setOutTradeNo(outTradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason)
                //.setOutRequestNo(outRequestNo)
                .setStoreId(storeId);

        AlipayF2FRefundResult result = AliPayConfig.getAlipayTradeService().tradeRefund(builder);
        switch (result.getTradeStatus()) {
            case SUCCESS:
                logger.info("支付宝退款成功: )");
                break;

            case FAILED:
                logger.info("支付宝退款失败!!!");
                message = Constants.FAIL;
                break;

            case UNKNOWN:
                logger.info("系统异常，订单退款状态未知!!!");
                message = Constants.FAIL;
                break;

            default:
                logger.info("不支持的交易状态，交易返回异常!!!");
                message = Constants.FAIL;
                break;
        }
        return message;
    }
    /**
     * 如果你调用的是当面付预下单接口(alipay.trade.precreate)，调用成功后订单实际上是没有生成，因为创建一笔订单要买家、卖家、金额三要素。
     * 预下单并没有创建订单，所以根据商户订单号操作订单，比如查询或者关闭，会报错订单不存在。
     * 当用户扫码后订单才会创建，用户扫码之前二维码有效期2小时，扫码之后有效期根据timeout_express时间指定。
     * =====只有支付成功后 调用此订单才可以=====
     */
    /**
     * 关闭订单
     *
     * @param product
     * @return String
     * @Author
     * @Date 2017年7月27日 更新日志
     * 2017年7月27日
     */
    public String aliCloseorder(Product product) {
        logger.info("订单号：" + product.getOutTradeNo() + "支付宝关闭订单");
        String message = Constants.SUCCESS;
        try {
            String imgPath = Constants.QRCODE_PATH + Constants.SF_FILE_SEPARATOR + "alipay_" + product.getOutTradeNo() + ".png";
            File file = new File(imgPath);
            if (file.exists()) {
                AlipayClient alipayClient = AliPayConfig.getAlipayClient();
                AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
                request.setBizContent("{" + "    \"out_trade_no\":\"" + product.getOutTradeNo() + "\"" + "  }");
                AlipayTradeCloseResponse response = alipayClient.execute(request);
                if (response.isSuccess()) {//扫码未支付的情况
                    logger.info("订单号：" + product.getOutTradeNo() + "支付宝关闭订单成功并删除支付二维码");
                    file.delete();
                } else {
                    if ("ACQ.TRADE_NOT_EXIST".equals(response.getSubCode())) {
                        logger.info("订单号：" + product.getOutTradeNo() + response.getSubMsg() + "(预下单 未扫码的情况)");
                    } else if ("ACQ.TRADE_STATUS_ERROR".equals(response.getSubCode())) {
                        logger.info("订单号：" + product.getOutTradeNo() + response.getSubMsg());
                    } else {
                        logger.info("订单号：" + product.getOutTradeNo() + "支付宝关闭订单失败" + response.getSubCode() + response.getSubMsg());
                        message = Constants.FAIL;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            message = Constants.FAIL;
            logger.info("订单号：" + product.getOutTradeNo() + "支付宝关闭订单异常");
        }
        return message;
    }

    /**
     * 下载对账单
     *
     * @param billDate(账单时间：日账单格式为yyyy-MM-dd，月账单格式为yyyy-MM。)
     * @param billType(trade、signcustomer；trade指商户基于支付宝交易收单的业务账单；signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单；)
     * @return String
     * @Author
     * @Date 2017年7月27日 更新日志
     * 2017年7月27日
     */
    public String downloadBillUrl(String billDate, String billType) {
        logger.info("获取支付宝订单地址:" + billDate);
        String downloadBillUrl = "";
        try {
            AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();
            request.setBizContent("{" + "    \"bill_type\":\"trade\"," + "    \"bill_date\":\"2016-12-26\"" + "  }");

            AlipayDataDataserviceBillDownloadurlQueryResponse response = AliPayConfig.getAlipayClient().execute(request);
            if (response.isSuccess()) {
                logger.info("获取支付宝订单地址成功:" + billDate);
                downloadBillUrl = response.getBillDownloadUrl();//获取下载地
            } else {
                logger.info("获取支付宝订单地址失败" + response.getSubMsg() + ":" + billDate);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("获取支付宝订单地址异常:" + billDate);
        }
        return downloadBillUrl;
    }

    /**
     * 手机H5支付、腾讯相关软件下不支持、使用UC等浏览器打开
     * 方法一：
     * 对于页面跳转类API，SDK不会也无法像系统调用类API一样自动请求支付宝并获得结果，而是在接受request请求对象后，
     * 为开发者生成前台页面请求需要的完整form表单的html（包含自动提交脚本），商户直接将这个表单的String输出到http response中即可。
     * 方法二：
     * 如果是远程调用返回消费放一个form表单 然后调用方刷新到页面自动提交即可
     *
     * @param product
     * @return String
     * @Author
     * @Date 2017年7月27日 更新日志
     * 2017年7月27日
     * 备注：人民币单位为分
     * attach 附件参数 使用json格式传递 用于回调区分
     */
    public String aliPayMobile(Product product) {
        logger.info("支付宝手机支付下单");
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        // alipayRequest.setReturnUrl(returnUrl);//前台通知
        alipayRequest.setNotifyUrl(notify_url);//后台回调
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", product.getOutTradeNo());
        bizContent.put("total_amount", product.getTotalFee());//订单金额:元
        bizContent.put("subject", product.getSubject());//订单标题
        bizContent.put("seller_id", Configs.getPid());//实际收款账号，一般填写商户PID即可
        bizContent.put("product_code", "QUICK_WAP_PAY");//手机网页支付
        bizContent.put("body", product.getBody());
        String biz = bizContent.toString().replaceAll("\"", "'");
        alipayRequest.setBizContent(biz);
        logger.info("业务参数:" + alipayRequest.getBizContent());
        String form = Constants.FAIL;
        try {
            form = AliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            logger.error("支付宝构造表单失败", e);
        }
        return form;
    }

    /**
     * 网站支付
     *
     * @param product
     * @return String
     * @Author
     * @Date 2017年7月30日 更新日志
     * 2017年7月30日
     */
    public String aliPayPc(Product product) {
        logger.info("支付宝PC支付下单");
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        String returnUrl = "前台回调地址 http 自定义";
        alipayRequest.setReturnUrl(returnUrl);//前台通知
        alipayRequest.setNotifyUrl(notify_url);//后台回调
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", product.getOutTradeNo());
        bizContent.put("total_amount", product.getTotalFee());//订单金额:元
        bizContent.put("subject", product.getSubject());//订单标题
        bizContent.put("seller_id", Configs.getPid());//实际收款账号，一般填写商户PID即可
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");//电脑网站支付
        bizContent.put("body", "两个苹果五毛钱");
        /**
         * 这里有三种模式可供选择
         * 如果在系统内支付，并且是弹出层支付，建议选择模式二、其他模式会跳出当前iframe(亲测有效)
         */
        bizContent.put("qr_pay_mode", "2");
        String biz = bizContent.toString().replaceAll("\"", "'");
        alipayRequest.setBizContent(biz);
        logger.info("业务参数:" + alipayRequest.getBizContent());
        String form = Constants.FAIL;
        try {
            form = AliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            logger.error("支付宝构造表单失败", e);
        }
        return form;
    }

    public String appPay(Product product) {
        String orderString = Constants.FAIL;
        // 实例化客户端
        AlipayClient alipayClient = AliPayConfig.getAlipayClient();
        // 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        // SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody(product.getBody());
        model.setSubject(product.getSubject());
        model.setOutTradeNo(product.getOutTradeNo());
        model.setTimeoutExpress("90m");
        model.setTotalAmount(product.getTotalFee());
        model.setProductCode("QUICK_MSECURITY_PAY");
        logger.info("阿里支付请求参数model==" + com.alibaba.fastjson.JSONObject.toJSONString(model));
        request.setBizModel(model);
        request.setNotifyUrl(notify_url);
        logger.info("阿里支付请求参数request==" + com.alibaba.fastjson.JSONObject.toJSONString(request));
        try {
            // 这里和普通的接口调用不同，使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            orderString = response.getBody();//就是orderString 可以直接给客户端请求，无需再做处理。
            //System.out.println(response.getBody());
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return orderString;
    }

    /**
     * 支付宝订单查询
     *
     * @param order
     * @return 是否需要更新订单信息
     */
    public boolean payQuery(UserOrder order) {
        AlipayClient alipayClient = AliPayConfig.getAlipayClient();
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", order.getId());
//        bizContent.put("trade_no", "2014112611001004680073956707");
        request.setBizContent(bizContent.toString());
        try {

            logger.info("查询订单状态: " + JSON.toJSONString(order));
            AlipayTradeQueryResponse response = alipayClient.certificateExecute(request);
            logger.info("阿里支付订单查询结果: " + JSON.toJSONString(response));
            if (response != null && response.isSuccess()) {
                String status = response.getTradeStatus();
                // WAIT_BUYER_PAY（交易创建，等待买家付款）、
                // TRADE_CLOSED（未付款交易超时关闭，或支付完成后全额退款）、
                // TRADE_SUCCESS（交易支付成功）、
                // TRADE_FINISHED（交易结束，不可退款）
                switch (status) {
                    case "WAIT_BUYER_PAY"://处理中
                        order.setPayStatus(PayStatus.IN_PROCESS.getValue());
                        break;
                    case "TRADE_SUCCESS"://成功
                        order.setPayStatus(PayStatus.SUCCESS.getValue());
                        break;
                    default://失败
                        order.setPayStatus(PayStatus.FAILED.getValue());
                        order.setFailedReason(status);
                        break;
                }
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 验证签名1
     *
     * @param params
     * @return
     */
    public boolean rsaCheckV1(Map<String, String> params) {
        //验证签名 校验签名
        boolean signVerified = false;
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, Configs.getAlipayPublicKey(), "UTF-8");
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return signVerified;
    }

    /**
     * 验证签名2
     *
     * @param params
     * @return
     */
    public boolean rsaCheckV2(Map<String, String> params) {
        //验证签名 校验签名
        boolean signVerified = false;
        try {
            signVerified = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(), "UTF-8");
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return signVerified;
    }

    /**
     * 老的支付宝转账接口
     *
     * @param product
     * @return
     */
    public BaseResponse<String> aliPayTransferUserOld(Product product) {
        logger.info("支付宝手机支付下单");
        AlipayFundTransToaccountTransferRequest alipayRequest = new AlipayFundTransToaccountTransferRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_biz_no", product.getOutTradeNo());
        bizContent.put("amount", product.getTotalFee());//订单金额:元
        bizContent.put("payee_type", "ALIPAY_LOGONID");//订单标题
        bizContent.put("payee_account", product.getPayeeAccount());
        bizContent.put("product_code", "TRANS_ACCOUNT_NO_PWD");//转到银行号
        bizContent.put("payee_real_name", product.getPayeeRealName());//转到银行号
        bizContent.put("payer_show_name", "慧信生活");
        bizContent.put("remark", product.getRemark());
        String biz = bizContent.toString().replaceAll("\"", "'");
        alipayRequest.setBizContent(biz);
        logger.info("ali-req:" + alipayRequest.getBizContent());
        String response = Constants.FAIL;
        try {
            AlipayFundTransToaccountTransferResponse transferResponse = AliPayConfig.getAlipayClient().execute(alipayRequest);
            logger.info("ali-rsp:" + com.alibaba.fastjson.JSONObject.toJSONString(transferResponse));
            if (transferResponse.isSuccess()) {
                return  new BaseResponse(MsgCodeEnum.SUCCESS, null) ;
            }

            return new BaseResponse(MsgCodeEnum.OTHER_ERROR, transferResponse.getSubMsg());
        } catch (AlipayApiException e) {
            logger.error("支付宝提现失败", e);
        }

        return new BaseResponse(MsgCodeEnum.OTHER_ERROR, response);
    }

    /**
     * 新的单笔转账接口 alipay.fund.trans.uni.transfer
     *
     * @param product
     * @return
     */
    public BaseResponse<String> aliPayTransferUser(Product product) {
        logger.info("支付宝手机支付下单");
        //文档路径 https://opendocs.alipay.com/open/309/106236#%E6%8E%A5%E5%85%A5%E8%AF%B4%E6%98%8E
        AlipayFundTransUniTransferRequest alipayRequest = new AlipayFundTransUniTransferRequest();
        JSONObject bizContent = new JSONObject();
//        out_biz_no	String	必选	64	商家侧唯一订单号，由商家自定义。对于不同转账请求，商家需保证该订单号在自身系统唯一。	201806300001
        bizContent.put("out_biz_no", product.getOutTradeNo());
//        trans_amount	Price	必选	20	订单总金额，单位为元，精确到小数点后两位，STD_RED_PACKET产品取值范围[0.01,100000000]； TRANS_ACCOUNT_NO_PWD产品取值范围[0.1,100000000]	23.00
//        bizContent.put("amount", product.getTotalFee());//订单金额:元
        bizContent.put("trans_amount", product.getTotalFee());
//        product_code	String	必选	64	业务产品码， 单笔无密转账到支付宝账户固定为: TRANS_ACCOUNT_NO_PWD； 收发现金红包固定为: STD_RED_PACKET；
        bizContent.put("product_code", "TRANS_ACCOUNT_NO_PWD");
//        biz_scene	String	可选	64	描述特定的业务场景，可传的参数如下： DIRECT_TRANSFER：单笔无密转账到支付宝，B2C现金红包; PERSONAL_COLLECTION：C2C现金红包-领红包	DIRECT_TRANSFER
        bizContent.put("biz_scene", "DIRECT_TRANSFER");
//        order_title	String	可选	64	转账业务的标题，用于在支付宝用户的账单里显示	转账标题
        bizContent.put("order_title", AliConfigs.getAppName());
//        original_order_id	String	可选	64	原支付宝业务单号。C2C现金红包-红包领取时，传红包支付时返回的支付宝单号；B2C现金红包、单笔无密转账到支付宝不需要该参数。	20190620110075000006640000063056
//        bizContent.put("original_order_id", "没有");
//        payee_info	Participant	必选		收款方信息
//            identity	String	必填	64	参与方的唯一标识	2088123412341234
//            identity_type	String	必填	64	参与方的标识类型，目前支持如下类型：
//                1、ALIPAY_USER_ID 支付宝的会员ID
//                2、ALIPAY_LOGON_ID：支付宝登录号，支持邮箱和手机号格式	ALIPAY_USER_ID
//            name	String	可选	256	参与方真实姓名，如果非空，将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时，本字段必填。	黄龙国际有限公司
        JSONObject payeeInfo = new JSONObject();
        payeeInfo.put("identity", product.getPayeeAccount());
        payeeInfo.put("identity_type", "ALIPAY_LOGON_ID");
        payeeInfo.put("name", product.getPayeeRealName());
        bizContent.put("payee_info", payeeInfo);
//        remark	String	可选	200	业务备注	单笔转账
        bizContent.put("remark", product.getRemark());
//        business_params	String	可选	2048	转账业务请求的扩展参数，支持传入的扩展参数如下：
//          sub_biz_scene 子业务场景，红包业务必传，取值REDPACKET，C2C现金红包、B2C现金红包均需传入	{"sub_biz_scene":"REDPACKET"}

        String biz = bizContent.toString().replaceAll("\"", "'");
        alipayRequest.setBizContent(biz);
        logger.info("ali-req:" + alipayRequest.getBizContent());
        String response = Constants.FAIL;
        try {

            AlipayClient alipayClient = AliPayConfig.getAlipayClient();
            AlipayFundTransUniTransferResponse transferResponse = alipayClient.certificateExecute(alipayRequest);
            logger.info("ali-rsp:" + com.alibaba.fastjson.JSONObject.toJSONString(transferResponse));
            if (transferResponse.isSuccess()) {
                return new BaseResponse(MsgCodeEnum.SUCCESS, null);
            }
            return new BaseResponse(MsgCodeEnum.OTHER_ERROR, transferResponse.getSubMsg());
        } catch (AlipayApiException e) {
            logger.error("支付宝提现失败", e);
        }
        return  new BaseResponse(MsgCodeEnum.OTHER_ERROR, response) ;
    }
}
